package com.yy.yunpan.share.service;

import com.yy.yunpan.share.entity.Share;
import org.springframework.data.domain.Page;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 分享服务接口
 *
 * @author YY
 * @since 2025-10-01
 */
public interface ShareService {

    /**
     * 创建分享
     *
     * @param userId      用户ID
     * @param fileId      文件ID
     * @param shareName   分享名称
     * @param permissions 权限：1查看，2下载，3管理
     * @param password    分享密码（可选）
     * @param expireTime  过期时间（可选）
     * @return 分享信息
     */
    Share createShare(Long userId, Long fileId, String shareName, Integer permissions, String password, LocalDateTime expireTime);

    /**
     * 根据分享码获取分享信息
     *
     * @param shareCode 分享码
     * @return 分享详细信息
     */
    Map<String, Object> getShareByCode(String shareCode);

    /**
     * 验证分享密码
     *
     * @param shareCode 分享码
     * @param password  密码
     * @return 验证结果和文件信息
     */
    Map<String, Object> verifySharePassword(String shareCode, String password);

    /**
     * 获取用户的分享列表
     *
     * @param userId    用户ID
     * @param page      页码
     * @param size      每页大小
     * @param orderBy   排序字段
     * @param orderType 排序类型
     * @return 分享列表
     */
    Page<Share> getUserShareList(Long userId, Integer page, Integer size, String orderBy, String orderType);

    /**
     * 取消分享
     *
     * @param userId  用户ID
     * @param shareId 分享ID
     */
    void cancelShare(Long userId, Long shareId);

    /**
     * 更新分享设置
     *
     * @param userId      用户ID
     * @param shareId     分享ID
     * @param shareName   分享名称
     * @param permissions 权限
     * @param password    密码
     * @param expireTime  过期时间
     * @return 更新后的分享信息
     */
    Share updateShare(Long userId, Long shareId, String shareName, Integer permissions, String password, LocalDateTime expireTime);

    /**
     * 增加访问次数
     *
     * @param shareCode 分享码
     */
    void incrementVisitCount(String shareCode);

    /**
     * 增加下载次数
     *
     * @param shareCode 分享码
     */
    void incrementDownloadCount(String shareCode);

    /**
     * 检查并更新过期分享状态
     */
    void updateExpiredShares();
}